package cn.fz.utils;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import org.bouncycastle.crypto.engines.SM2Engine;

import java.util.Map;

public class SM2Utils {
    // public static String sm2Encrypt(String publicKey, String data) {
    //     return SM2Utils.sm2Encrypt(publicKey, data, "");
    // }

    // 生成密钥对代码示例
    public static Map<String,String> generateSM2KeysBase64() {
        // 初始化SM2对象，自动生成密钥对
        SM2 sm2 = new SM2();
        // 获取私钥（Base64编码）
        String privateKey = sm2.getPrivateKeyBase64();
        // 获取公钥（Base64编码）
        String publicKey = sm2.getPublicKeyBase64();
        return Map.of("privateKey", privateKey, "publicKey", publicKey);
    }

    // 加密
    public static String encryptBase64(String publicKeyHex,String data) {
        // 1. 初始化SM2对象（使用公钥加密）
        SM2 sm2Encrypt = new SM2(null, publicKeyHex); // 仅传入公钥
        // 设置加密模式为C1C3C2（国密标准）
        sm2Encrypt.setMode(SM2Engine.Mode.C1C2C3);
        // 2. 加密明文
        return sm2Encrypt.encryptBase64(data, CharsetUtil.CHARSET_UTF_8, KeyType.PublicKey);
    }

    // 解密
    public static String decryptBase64(String privateKeyHex,String data) {
        // 3. 使用私钥解密验证
        SM2 sm2Decrypt = new SM2(privateKeyHex, null); // 仅传入公钥
        // 设置加密模式为C1C3C2（国密标准）
        sm2Decrypt.setMode(SM2Engine.Mode.C1C3C2);
        // 2. 加密明文
        return sm2Decrypt.decryptStr(data, KeyType.PrivateKey);
    }
}
